[[...path]].page.tsx 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. import React from 'react';
  2. import {
  3. NextPage, GetServerSideProps, GetServerSidePropsContext,
  4. } from 'next';
  5. import { useTranslation } from 'next-i18next';
  6. import { serverSideTranslations } from 'next-i18next/serverSideTranslations';
  7. import dynamic from 'next/dynamic';
  8. import { useRouter } from 'next/router';
  9. import { CrowiRequest } from '~/interfaces/crowi-request';
  10. import {
  11. CommonProps, getServerSideCommonProps, useCustomTitle, getNextI18NextConfig,
  12. } from '~/pages/commons';
  13. import PluginUtils from '~/server/plugins/plugin-utils';
  14. import ConfigLoader from '~/server/service/config-loader';
  15. import {
  16. useCurrentUser, /* useSearchServiceConfigured, */ useIsSearchServiceReachable, useSiteUrl,
  17. } from '~/stores/context';
  18. // import { useEnvVars } from '~/stores/admin-context';
  19. const AdminHome = dynamic(() => import('../../components/Admin/AdminHome/AdminHome'), { ssr: false });
  20. const AppSettingsPageContents = dynamic(() => import('../../components/Admin/App/AppSettingsPageContents'), { ssr: false });
  21. const SecurityManagementContents = dynamic(() => import('../../components/Admin/Notification/NotificationSetting'), { ssr: false });
  22. const MarkDownSettingContents = dynamic(() => import('../../components/Admin/MarkdownSetting/MarkDownSettingContents'), { ssr: false });
  23. const CustomizeSettingContents = dynamic(() => import('../../components/Admin/Customize/Customize'), { ssr: false });
  24. const DataImportPageContents = dynamic(() => import('../../components/Admin/ImportData/ImportDataPageContents'), { ssr: false });
  25. const ExportArchiveDataPage = dynamic(() => import('../../components/Admin/ExportArchiveDataPage'), { ssr: false });
  26. const NotificationSetting = dynamic(() => import('../../components/Admin/Notification/NotificationSetting'), { ssr: false });
  27. const SlackIntegration = dynamic(() => import('../../components/Admin/SlackIntegration/SlackIntegration'), { ssr: false });
  28. const LegacySlackIntegration = dynamic(() => import('../../components/Admin/LegacySlackIntegration/LegacySlackIntegration'), { ssr: false });
  29. const UserManagement = dynamic(() => import('../../components/Admin/UserManagement'), { ssr: false });
  30. const UserGroupPage = dynamic(() => import('../../components/Admin/UserGroup/UserGroupPage'), { ssr: false });
  31. const ElasticsearchManagement = dynamic(() => import('../../components/Admin/ElasticsearchManagement/ElasticsearchManagement'), { ssr: false });
  32. // named export
  33. const AuditLogManagement = dynamic(() => import('../../components/Admin/AuditLogManagement').then(module => module.AuditLogManagement));
  34. const AdminLayout = dynamic(() => import('../../components/Layout/AdminLayout'), { ssr: false });
  35. const pluginUtils = new PluginUtils();
  36. type Props = CommonProps & {
  37. currentUser: any,
  38. nodeVersion: string,
  39. npmVersion: string,
  40. yarnVersion: string,
  41. installedPlugins: any,
  42. envVars: any,
  43. isSearchServiceConfigured: boolean,
  44. isSearchServiceReachable: boolean,
  45. siteUrl: string,
  46. };
  47. const AdminMarkdownSettingsPage: NextPage<Props> = (props: Props) => {
  48. const { t } = useTranslation('admin');
  49. const router = useRouter();
  50. const path = router.query.path || 'home';
  51. const name = Array.isArray(path) ? path[0] : path;
  52. const adminPagesMap = {
  53. home: {
  54. title: useCustomTitle(props, t('Wiki Management Home Page')),
  55. component: <AdminHome
  56. nodeVersion={props.nodeVersion}
  57. npmVersion={props.npmVersion}
  58. yarnVersion={props.yarnVersion}
  59. installedPlugins={props.installedPlugins}
  60. />,
  61. },
  62. app: {
  63. title: useCustomTitle(props, t('App Settings')),
  64. component: <AppSettingsPageContents />,
  65. },
  66. security: {
  67. title: useCustomTitle(props, t('security_settings')),
  68. component: <SecurityManagementContents />,
  69. },
  70. markdown: {
  71. title: useCustomTitle(props, t('Markdown Settings')),
  72. component: <MarkDownSettingContents />,
  73. },
  74. customize: {
  75. title: useCustomTitle(props, t('Customize Settings')),
  76. component: <CustomizeSettingContents />,
  77. },
  78. importer: {
  79. title: useCustomTitle(props, t('Import Data')),
  80. component: <DataImportPageContents />,
  81. },
  82. export: {
  83. title: useCustomTitle(props, t('Export Archive Data')),
  84. component: <ExportArchiveDataPage />,
  85. },
  86. notification: {
  87. title: useCustomTitle(props, t('Notification Settings')),
  88. component: <NotificationSetting />,
  89. },
  90. 'global-notification': {
  91. title: '',
  92. component: <>global-notification</>,
  93. },
  94. 'slack-integration': {
  95. title: useCustomTitle(props, t('slack_integration')),
  96. component: <SlackIntegration />,
  97. },
  98. 'slack-integration-legacy': {
  99. title: useCustomTitle(props, t('Legacy_Slack_Integration')),
  100. component: <LegacySlackIntegration />,
  101. },
  102. users: {
  103. title: useCustomTitle(props, t('User_Management')),
  104. component: <UserManagement />,
  105. },
  106. 'user-groups': {
  107. title: useCustomTitle(props, t('UserGroup Management')),
  108. component: <UserGroupPage />,
  109. },
  110. search: {
  111. title: useCustomTitle(props, t('Full Text Search Management')),
  112. component: <ElasticsearchManagement />,
  113. },
  114. 'audit-log': {
  115. title: useCustomTitle(props, t('AuditLog')),
  116. component: <AuditLogManagement />,
  117. },
  118. };
  119. const content = adminPagesMap[name];
  120. const title = content.title;
  121. useCurrentUser(props.currentUser != null ? JSON.parse(props.currentUser) : null);
  122. // useSearchServiceConfigured(props.isSearchServiceConfigured);
  123. useIsSearchServiceReachable(props.isSearchServiceReachable);
  124. useSiteUrl(props.siteUrl);
  125. // useEnvVars(props.envVars);
  126. return (
  127. <AdminLayout title={title} selectedNavOpt={name}>
  128. {content.component}
  129. </AdminLayout>
  130. );
  131. };
  132. /**
  133. * for Server Side Translations
  134. * @param context
  135. * @param props
  136. * @param namespacesRequired
  137. */
  138. async function injectNextI18NextConfigurations(context: GetServerSidePropsContext, props: Props, namespacesRequired?: string[] | undefined): Promise<void> {
  139. const nextI18NextConfig = await getNextI18NextConfig(serverSideTranslations, context, namespacesRequired);
  140. props._nextI18Next = nextI18NextConfig._nextI18Next;
  141. }
  142. export const getServerSideProps: GetServerSideProps = async(context: GetServerSidePropsContext) => {
  143. const req: CrowiRequest = context.req as CrowiRequest;
  144. const { crowi } = req;
  145. const {
  146. appService, searchService,
  147. } = crowi;
  148. const { user } = req;
  149. const result = await getServerSideCommonProps(context);
  150. // check for presence
  151. // see: https://github.com/vercel/next.js/issues/19271#issuecomment-730006862
  152. if (!('props' in result)) {
  153. throw new Error('invalid getSSP result');
  154. }
  155. const props: Props = result.props as Props;
  156. if (user != null) {
  157. // props.currentUser = JSON.stringify(user.toObject());
  158. props.currentUser = JSON.stringify(user);
  159. }
  160. injectNextI18NextConfigurations(context, props, ['admin']);
  161. props.siteUrl = appService.getSiteUrl();
  162. props.nodeVersion = crowi.runtimeVersions.versions.node ? crowi.runtimeVersions.versions.node.version.version : null;
  163. props.npmVersion = crowi.runtimeVersions.versions.npm ? crowi.runtimeVersions.versions.npm.version.version : null;
  164. props.yarnVersion = crowi.runtimeVersions.versions.yarn ? crowi.runtimeVersions.versions.yarn.version.version : null;
  165. props.installedPlugins = pluginUtils.listPlugins();
  166. props.envVars = await ConfigLoader.getEnvVarsForDisplay(true);
  167. props.isSearchServiceConfigured = searchService.isConfigured;
  168. props.isSearchServiceReachable = searchService.isReachable;
  169. return {
  170. props,
  171. };
  172. };
  173. export default AdminMarkdownSettingsPage;